home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / Softshoe / Lisa's Mac Parts / Views / Tiled Views / PaneRow.cp < prev    next >
Text File  |  2000-06-23  |  4KB  |  150 lines

  1. // PaneRow.cp
  2.  
  3. #ifndef PaneRow_h
  4. #include "PaneRow.h"
  5. #endif
  6. #ifndef MinMax_h
  7. #include "MinMax.h"
  8. #endif
  9. #ifndef Overflow_h
  10. #include "Overflow.h"
  11. #endif
  12. #ifndef TiledPane_h
  13. #include "TiledPane.h"
  14. #endif
  15.  
  16. void PaneRow::PaneSizeChanged()
  17.   {
  18.     if ( !PaneSizeKnown() )
  19.         return;
  20.     
  21.     Assert( !Panes().IsEmpty() );
  22.     
  23.     int32 oldWidth = (*Panes().Last())->Bounds().right;
  24.     
  25.     for ( PaneLoop pane( Panes() ); pane.Unfinished(); pane++ )
  26.         pane->proposedSize = 0;
  27.     
  28.     int32 remainder = Asint32( PaneSize().h );
  29.     
  30.     for ( PaneLoop pane( Panes() ); remainder > 0 && pane.Unfinished(); pane++ )
  31.       {
  32.         uint32 minimum = Min( remainder, pane->Sizer().MinimumWidth() );
  33.         
  34.         pane->proposedSize = minimum;
  35.         remainder -= minimum;
  36.       }
  37.  
  38.     Assert( TotalProposedSize() + remainder == Asint32( PaneSize().h ) );
  39.     
  40.     for ( PaneLoop pane( Panes() ); remainder > 0 && pane.Unfinished(); pane++ )
  41.       {
  42.         int32 best = pane->Sizer().BestWidth( Range32( pane->proposedSize,
  43.                                                                       pane->proposedSize + remainder ) );
  44.         
  45.         int32 increase = best - pane->proposedSize;
  46.         remainder -= increase;
  47.         pane->proposedSize += increase;
  48.       }
  49.  
  50.     Assert( TotalProposedSize() + remainder == Asint32( PaneSize().h ) );
  51.     
  52.     for ( PaneLoop pane( *Panes().Last() ); remainder > 0 && pane.Unfinished(); pane-- )
  53.       {
  54.         int32 maximum = Min( pane->proposedSize + remainder,
  55.                                     pane->Sizer().MaximumWidth() );
  56.         
  57.         int32 increase = maximum - pane->proposedSize;
  58.         remainder -= increase;
  59.         pane->proposedSize += increase;
  60.       }
  61.  
  62.     Assert( TotalProposedSize() + remainder == Asint32( PaneSize().h ) );
  63.     
  64.     if ( remainder > 0 )
  65.         (*Panes().Last())->proposedSize += remainder;
  66.  
  67.     Assert( TotalProposedSize() == Asint32( PaneSize().h ) );
  68.     
  69.     uint32 position = 0;
  70.     
  71.     for ( PaneLoop pane( Panes() ); pane.Unfinished(); pane++ )
  72.       {
  73.         pane->proposedBounds = Rectangle32( position,                                0,
  74.                                                         position + pane->proposedSize,    PaneSize().v );
  75.         position += pane->proposedSize;
  76.       }
  77.     
  78.     if ( oldWidth <= PaneSize().h )
  79.         ShufflePanesForward();
  80.      else
  81.         ShufflePanesBackward();
  82.   }
  83.  
  84. int32 PaneRow::MinimumWidth() const
  85.   {
  86.     return TotalOf( &SuggestsPaneSize::MinimumWidth );
  87.   }
  88.  
  89. int32 PaneRow::MinimumHeight() const
  90.   {
  91.     return MaximumOf( &SuggestsPaneSize::MinimumHeight );
  92.   }
  93.  
  94. int32 PaneRow::MaximumWidth() const
  95.   {
  96.     return TotalOf( &SuggestsPaneSize::MaximumWidth );
  97.   }
  98.  
  99. int32 PaneRow::MaximumHeight() const
  100.   {
  101.     return MinimumOf( &SuggestsPaneSize::MaximumHeight );
  102.   }
  103.  
  104. int32 PaneRow::ReasonableWidth() const
  105.   {
  106.     return TotalOf( &SuggestsPaneSize::ReasonableWidth );
  107.   }
  108.  
  109. int32 PaneRow::ReasonableHeight() const
  110.   {
  111.     return MaximumOf( &SuggestsPaneSize::ReasonableHeight );
  112.   }
  113.  
  114. int32 PaneRow::BestWidth( Range32 bounds ) const
  115.   {
  116.     int32 remainder = bounds.End();
  117.     
  118.     for ( PaneLoop pane( Panes() ); remainder > 0 && pane.Unfinished(); pane++ )
  119.       {
  120.         uint32 minimum = Min( remainder, pane->Sizer().MinimumWidth() );
  121.         
  122.         pane->proposedSize = minimum;
  123.         remainder -= minimum;
  124.       }
  125.     
  126.     for ( PaneLoop pane( Panes() ); remainder > 0 && pane.Unfinished(); pane++ )
  127.       {
  128.         int32 best = pane->Sizer().BestWidth( Range32( pane->proposedSize,
  129.                                                                       pane->proposedSize + remainder ) );
  130.         
  131.         remainder -= best - pane->proposedSize;
  132.         pane->proposedSize = best;
  133.       }
  134.     
  135.     return bounds.WeaklyRestrict( bounds.End() - remainder );
  136.   }
  137.  
  138. int32 PaneRow::BestHeight( Range32 bounds ) const
  139.   {
  140.     bounds.SetStart( bounds.WeaklyRestrict( MinimumHeight() ) );
  141.     bounds.SetEnd( bounds.WeaklyRestrict( MaximumHeight() ) );
  142.     
  143.     int32 best = 0;
  144.     
  145.     for ( PaneLoop pane( Panes() ); pane.Unfinished(); pane++ )
  146.         best = Max( best, pane->Sizer().BestHeight( bounds ) );
  147.  
  148.     return best;
  149.   }
  150.